package com.test.ad.demo.util;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import java.util.Date;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import java.util.Date;

public class ClickTimer {
    private static final String PREFS_NAME = "click_time_cache";
    private static final String LOCK_SUFFIX = "_lock_time";
    private static final String INTERVAL_SUFFIX = "_interval";
    private static SharedPreferences prefs;
    private static final String TAG = "ClickTimer";

    /**
     * 初始化方法（在Application的onCreate中调用）
     */
    public static void init(@NonNull Context context) {
        prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        Log.d(TAG, "ClickTimer initialized");
    }

    /**
     * 设置按钮的间隔时间（永久存储）
     * @param buttonId 按钮唯一标识
     * @param intervalSeconds 间隔时间（秒）
     */
    public static void setIntervalSeconds(@NonNull String buttonId, int intervalSeconds) {
        Log.d(TAG, "设置间隔时间 - 按钮: " + buttonId + ", 间隔: " + intervalSeconds + "秒");

        prefs.edit()
                .putInt(buttonId + INTERVAL_SUFFIX, intervalSeconds)
                .apply();

        // 同时设置锁定时间为当前时间
        setLockTimeToNow(buttonId);
    }

    /**
     * 获取剩余等待时间（秒）
     * @param buttonId 按钮唯一标识
     * @return 剩余秒数（0表示可以点击）
     */
    public static int getRemainingSeconds(@NonNull String buttonId) {
        Log.d(TAG, "获取剩余时间 - 按钮: " + buttonId);

        // 获取存储的间隔时间
        int intervalSeconds = prefs.getInt(buttonId + INTERVAL_SUFFIX, 0);
        Log.d(TAG, "读取到的间隔时间: " + intervalSeconds + "秒");

        if (intervalSeconds <= 0) {
            Log.d(TAG, "间隔时间未设置或为0，返回0");
            return 0;
        }

        long currentTime = System.currentTimeMillis();
        long lockTime = prefs.getLong(buttonId + LOCK_SUFFIX, 0);

        Log.d(TAG, "当前时间: " + currentTime + " (" + new Date(currentTime) + ")");
        Log.d(TAG, "锁定时间: " + lockTime + " (" + new Date(lockTime) + ")");

        // 处理系统时间被修改的情况
        if (currentTime < lockTime) {
            Log.d(TAG, "检测到系统时间被回拨，返回完整间隔时间");
            return intervalSeconds;
        }

        long timePassed = currentTime - lockTime;
        Log.d(TAG, "已过去时间: " + timePassed + "毫秒 (" + (timePassed/1000) + "秒)");

        long remainingMillis = intervalSeconds * 1000L - timePassed;
        Log.d(TAG, "剩余毫秒: " + remainingMillis);

        // 如果剩余时间小于0，返回0；否则返回剩余秒数
        int result = remainingMillis <= 0 ? 0 : (int) (remainingMillis / 1000);
        Log.d(TAG, "计算结果: " + result + "秒");

        return result;
    }

    /**
     * 检查是否可以点击（更新锁定时间并返回布尔值）
     * @param buttonId 按钮唯一标识
     * @return 是否允许点击（true表示可以点击）
     */
    public static boolean canClick(@NonNull String buttonId) {
        Log.d(TAG, "检查是否可以点击 - 按钮: " + buttonId);

        int remaining = getRemainingSeconds(buttonId);

        if (remaining <= 0) {
            Log.d(TAG, "允许点击，更新锁定时间");
            // 更新锁定时间
            prefs.edit()
                    .putLong(buttonId + LOCK_SUFFIX, System.currentTimeMillis())
                    .apply();
            return true;
        }

        Log.d(TAG, "不允许点击，剩余时间: " + remaining + "秒");
        return false;
    }

    /**
     * 获取锁定时间（用于调试）
     * @param buttonId 按钮唯一标识
     * @return 锁定时间的时间戳
     */
    public static long getLockTime(@NonNull String buttonId) {
        return prefs.getLong(buttonId + LOCK_SUFFIX, 0);
    }

    /**
     * 获取间隔时间（用于调试）
     * @param buttonId 按钮唯一标识
     * @return 间隔时间（秒）
     */
    public static int getIntervalSecondsValue(@NonNull String buttonId) {
        return prefs.getInt(buttonId + INTERVAL_SUFFIX, 0);
    }

    /**
     * 重置按钮的锁定状态
     * @param buttonId 按钮唯一标识
     */
    public static void reset(@NonNull String buttonId) {
        Log.d(TAG, "重置按钮状态 - 按钮: " + buttonId);

        prefs.edit()
                .remove(buttonId + LOCK_SUFFIX)
                .remove(buttonId + INTERVAL_SUFFIX)
                .apply();
    }

    /**
     * 强制设置锁定时间为当前时间
     * @param buttonId 按钮唯一标识
     */
    public static void setLockTimeToNow(@NonNull String buttonId) {
        long currentTime = System.currentTimeMillis();
        Log.d(TAG, "设置锁定时间为当前时间 - 按钮: " + buttonId + ", 时间: " + currentTime);

        prefs.edit()
                .putLong(buttonId + LOCK_SUFFIX, currentTime)
                .apply();
    }

    /**
     * 获取调试信息
     * @param buttonId 按钮唯一标识
     * @return 包含所有相关信息的字符串
     */
    public static String getDebugInfo(@NonNull String buttonId) {
        int intervalSeconds = getIntervalSecondsValue(buttonId);
        long lockTime = getLockTime(buttonId);
        long currentTime = System.currentTimeMillis();
        int remainingSeconds = getRemainingSeconds(buttonId);

        return "按钮ID: " + buttonId +
                "\n间隔时间: " + intervalSeconds + " 秒 (" + (intervalSeconds / 3600.0) + " 小时)" +
                "\n锁定时间: " + lockTime + " (" + new Date(lockTime) + ")" +
                "\n当前时间: " + currentTime + " (" + new Date(currentTime) + ")" +
                "\n时间差: " + (currentTime - lockTime) + " 毫秒 (" + ((currentTime - lockTime) / 1000) + " 秒)" +
                "\n剩余时间: " + remainingSeconds + " 秒 (" + (remainingSeconds / 3600.0) + " 小时)";
    }

    /**
     * 检查SharedPreferences中是否存在指定键
     * @param buttonId 按钮唯一标识
     */
    public static void checkKeys(@NonNull String buttonId) {
        String intervalKey = buttonId + INTERVAL_SUFFIX;
        String lockKey = buttonId + LOCK_SUFFIX;

        boolean hasInterval = prefs.contains(intervalKey);
        boolean hasLock = prefs.contains(lockKey);

        Log.d(TAG, "检查键是否存在 - 按钮: " + buttonId);
        Log.d(TAG, "间隔键(" + intervalKey + "): " + (hasInterval ? "存在" : "不存在"));
        Log.d(TAG, "锁定键(" + lockKey + "): " + (hasLock ? "存在" : "不存在"));

        if (hasInterval) {
            Log.d(TAG, "间隔值: " + prefs.getInt(intervalKey, -1));
        }

        if (hasLock) {
            Log.d(TAG, "锁定值: " + prefs.getLong(lockKey, -1));
        }
    }
}